#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h> // 为了 exit()

int main() {
    int fd_with_mode, fd_without_mode_simulated;
    char filename_with_mode[] = "file_created_with_mode.txt";
    char filename_without_mode_simulated[] = "file_created_without_mode.txt";

    // 定义一个明确的权限模式 (例如: rw-r----- , 八进制 0640)
    mode_t explicit_mode = S_IRUSR | S_IWUSR | S_IRGRP; // 0640

    // --- 情况1: 使用 open 函数的第三个参数指定文件访问权限 ---
    printf("情况1: 使用第三个参数 mode (0%o) 创建文件 '%s'\n", explicit_mode, filename_with_mode);
    // O_TRUNC: 如果文件存在，将其长度截断为0
    fd_with_mode = open(filename_with_mode, O_RDWR | O_CREAT | O_TRUNC, explicit_mode);
    if (fd_with_mode < 0) {
        perror("错误：创建/打开 (with mode) 文件失败");
        // exit(1); // 即使一个失败，也尝试另一个
    } else {
        printf("文件 '%s' 创建/打开成功。文件描述符: %d\n", filename_with_mode, fd_with_mode);
        // 可以进行一些写入操作，但本实验重点是权限
        char content1[] = "Content for file with explicit mode.";
        ssize_t bytes_written1 = write(fd_with_mode, content1, strlen(content1));
        if (bytes_written1 < 0) {
            perror("写入文件 (with mode) 失败");
        } else {
            printf("向 '%s' 写入了 %zd 字节。\n", filename_with_mode, bytes_written1);
        }
        close(fd_with_mode);
        printf("文件 '%s' 已关闭。\n", filename_with_mode);
    }
    printf("--------------------------------------------------\n");

    // --- 情况2: 模拟不使用第三个参数 (或使用一个非常宽松的 mode，让 umask 起主要作用) ---
    // 我们将使用一个常见的默认基础权限 0666，然后看 umask 如何影响它。
    mode_t default_base_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; // 0666
    printf("情况2: 模拟不显式指定严格权限 (使用基础 mode 0%o) 创建文件 '%s'\n", default_base_mode, filename_without_mode_simulated);
    fd_without_mode_simulated = open(filename_without_mode_simulated, O_RDWR | O_CREAT | O_TRUNC, default_base_mode);
    if (fd_without_mode_simulated < 0) {
        perror("错误：创建/打开 (without mode simulated) 文件失败");
        // exit(1);
    } else {
        printf("文件 '%s' 创建/打开成功。文件描述符: %d\n", filename_without_mode_simulated, fd_without_mode_simulated);
        char content2[] = "Content for file with default base mode.";
        ssize_t bytes_written2 = write(fd_without_mode_simulated, content2, strlen(content2));
        if (bytes_written2 < 0) {
            perror("写入文件 (without mode simulated) 失败");
        } else {
            printf("向 '%s' 写入了 %zd 字节。\n", filename_without_mode_simulated, bytes_written2);
        }
        close(fd_without_mode_simulated);
        printf("文件 '%s' 已关闭。\n", filename_without_mode_simulated);
    }
    printf("--------------------------------------------------\n");

    return 0;
}